import { red, green, bold } from 'kolorist'
import fs from 'fs-extra'
import path from 'path'
import { fileURLToPath } from 'url'
import prompts from 'prompts'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

// 验证项目名称
function isValidPackageName(projectName: string) {
  return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(projectName)
}

// 将项目名称转换为合法的包名
function toValidPackageName(projectName: string) {
  return projectName
    .trim()
    .toLowerCase()
    .replace(/\s+/g, '-')
    .replace(/^[._]/, '')
    .replace(/[^a-z0-9-~]+/g, '-')
}

export async function createVue3Element(projectName: string) {
  let targetDir = projectName

  if (!projectName) {
    console.log(red('✖') + ' 项目创建已取消')
    process.exit(1)
  }

  targetDir = projectName

  // 验证项目名称
  const validatedProjectName = toValidPackageName(projectName)
  if (!isValidPackageName(validatedProjectName)) {
    console.error(red('错误：') + `项目名称 ${projectName} 不是一个有效的包名称`)
    process.exit(1)
  }

  // 检查目标目录是否已存在
  if (fs.existsSync(targetDir)) {
    const { overwrite } = await prompts({
      type: 'confirm',
      name: 'overwrite',
      message: `目标目录 ${targetDir} 已存在。是否删除现有文件并继续?`,
      initial: false
    })

    if (overwrite) {
      console.log(`\n正在删除 ${targetDir}...`)
      await fs.remove(targetDir)
    } else {
      console.log(red('✖') + ' 操作取消')
      process.exit(1)
    }
  }

  console.log(`\n正在创建项目 ${green(targetDir)}...`)

  // 获取模板目录路径
  const templateDir = path.resolve(__dirname)

  try {
    // 创建项目目录
    await fs.ensureDir(targetDir)

    // 复制模板文件
    const filesToCopy = await fs.readdir(templateDir)
    for (const file of filesToCopy) {
      // 跳过index.ts/index.js文件，因为这是CLI工具本身
      if (file === 'index.ts' || file === 'index.js') continue
      
      await fs.copy(
        path.join(templateDir, file),
        path.join(targetDir, file)
      )
    }

    // 更新项目的package.json
    const pkgPath = path.join(targetDir, 'package.json')
    const pkg = await fs.readJson(pkgPath)
    pkg.name = validatedProjectName
    await fs.writeJson(pkgPath, pkg, { spaces: 2 })

    console.log(`\n${green('✔')} 项目创建成功！执行以下命令开始开发：\n`)
    console.log(bold(`  cd ${targetDir}`))
    console.log(bold('  pnpm install'))
    console.log(bold('  pnpm dev\n'))

  } catch (err) {
    console.error(red('错误：') + err)
    process.exit(1)
  }
}